#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 包含stdlib.h以使用abs函数

#include "AD.h"
#include "dht.h"
#include "Data.h"
#include "OLED.h"
#include "MyRTC.h"
#include "Delay.h"
#include "Menu_table.h"

uint8_t taskIndex = 0;					//	任务调度序号
int Sampling_Interval_Count = 1;		//	采样间隔计数用量
extern volatile uint8_t captureFlag; 	//  在 Menu_table.c 中声明标志位

/**
  * @brief  一级界面函数
  * @param  无
  * @retval 无
  */
void Menu_Interface(void)
{
	//int sprintf(char *str, const char *format, ...);格式输出函数
	// 用于存储格式化的时间字符串
	char buff[50];
	// 读取当前时间
	MyRTC_ReadTime();
	
	sprintf (buff,"%0.2d:%0.2d:%0.2d",MyRTC_Time[3],MyRTC_Time[4],MyRTC_Time[5]);
	OLED_ShowString(1, 16, 24,buff,1);
	
	sprintf (buff,"%0.4d-%0.2d-%0.2d",MyRTC_Time[0],MyRTC_Time[1],MyRTC_Time[2]);
	OLED_ShowString(3, 4, 16,buff,1);
}

/**
  * @brief  二级界面函数
  * @param  无
  * @retval 无
  */
void Function_Interface1(void)
{
	// 显示编码后的中文字符串
	OLED_ShowChineseString( 0, 1, "1245", 0);
	OLED_ShowChineseString( 2, 1, "3245", 1);
	OLED_ShowChineseString( 4, 1, "12678", 1);
	OLED_ShowChineseString( 6, 1, "12458", 1);
}
void Function_Interface2(void)
{
	// 显示编码后的中文字符串
	OLED_ShowChineseString( 0, 1, "1245", 1);
	OLED_ShowChineseString( 2, 1, "3245", 0);
	OLED_ShowChineseString( 4, 1, "12678", 1);
	OLED_ShowChineseString( 6, 1, "12458", 1);

}
void Function_Interface3(void)
{
	// 显示编码后的中文字符串
	OLED_ShowChineseString( 0, 1, "1245", 1);
	OLED_ShowChineseString( 2, 1, "3245", 1);
	OLED_ShowChineseString( 4, 1, "12678", 0);
	OLED_ShowChineseString( 6, 1, "12458", 1);
}
void Function_Interface4(void)
{
	// 显示编码后的中文字符串
	OLED_ShowChineseString( 0, 1, "1245", 1);
	OLED_ShowChineseString( 2, 1, "3245", 1);
	OLED_ShowChineseString( 4, 1, "12678", 1);
	OLED_ShowChineseString( 6, 1, "12458", 0);
}

/**
  * @brief  三级界面函数
  * @param  设置有三种状态
  * @retval 无
  */
void Function_Interface5(void)
{   
	unsigned int DHT_Temperature[4];
	
	// 从AD0获取温度
	GetADCTem(TempData1.Temperature,AD0);
	// 从AD1获取温度
	GetADCTem(TempData2.Temperature,AD1);
	
	//读取DHT11传感器的数据
	DHT11_REC_Data(GPIOA, GPIO_Pin_2, DHT_Temperature);
	UintChangeToChar(TempData1.DHT_Humidity, TempData1.DHT_Temperature, DHT_Temperature);
	
	DHT11_REC_Data(GPIOA, GPIO_Pin_8, DHT_Temperature);
	UintChangeToChar(TempData2.DHT_Humidity, TempData2.DHT_Temperature, DHT_Temperature);
	
	//标号显示
	OLED_ShowString(1, 1, 16,"Tem1:",1);
	OLED_ShowString(2, 1, 16,"Tem2:",1);
	OLED_ShowString(3, 1, 16,"Tem3:",1);
	OLED_ShowString(4, 1, 16,"Tem4:",1);

	//温度1 DHT11
	OLED_ShowString(1, 7, 16,TempData1.DHT_Temperature,1);		// 显示温度字符串
	OLED_ShowChinesepixel(0, 88, 0); 						// 显示中文字符
	
	//温度2 DHT11
	OLED_ShowString(2, 7, 16,TempData2.DHT_Temperature,1);		// 显示温度字符串
	OLED_ShowChinesepixel(18, 88, 0);						// 显示中文字符
	
	//温度3 热敏电阻
	OLED_ShowString(3, 7, 16,TempData1.Temperature,1);		// 显示温度字符串
	OLED_ShowChinesepixel(36, 88, 0);						// 显示中文字符
	
	//温度4 热敏电阻
	OLED_ShowString(4, 7, 16,TempData2.Temperature,1);		// 显示温度字符串
	OLED_ShowChinesepixel(54, 88, 0);						// 显示中文字符
	
	Delay_ms(5);
	
}

void Function_Interface6(void)
{
	unsigned int DHT_Temperature[4];
	//读取DHT11传感器的数据
	DHT11_REC_Data(GPIOA, GPIO_Pin_2, DHT_Temperature);
	UintChangeToChar(TempData1.DHT_Humidity, TempData1.DHT_Temperature, DHT_Temperature);
	
	DHT11_REC_Data(GPIOA, GPIO_Pin_8, DHT_Temperature);
	UintChangeToChar(TempData2.DHT_Humidity, TempData2.DHT_Temperature, DHT_Temperature);
	
	// 显示中文字符串
	OLED_ShowChineseString( 0, 1, "32", 1);
	OLED_ShowString(1, 5, 16, "1:",1);
	OLED_ShowString(1, 8, 16,TempData1.DHT_Humidity,1);		// 显示湿度
	OLED_ShowChar(1,10,16,'%',1); 							// 显示百分号
	
	OLED_ShowChineseString( 2, 1, "32", 1);
	OLED_ShowString(2, 5, 16, "2:",1);
	OLED_ShowString(2, 8, 16,TempData2.DHT_Humidity,1);		// 显示湿度
	OLED_ShowChar(2,10,16,'%',1); 						// 显示百分号
	
	Delay_ms(5);
}

void Function_Interface7(void)
{   
	// 显示标号
	OLED_ShowString(1, 1, 16,"AVE1:",1);
	OLED_ShowString(2, 1, 16,"AVE2:",1);
	OLED_ShowString(3, 1, 16,"AVE3:",1);
	OLED_ShowString(4, 1, 16,"AVE4:",1);
	
	// 显示DHT11平均温度整数部分
	OLED_ShowString(1, 7, 16, TempData1.DHT_TemperatureAve, 1);
	OLED_ShowString(1, 12, 16, TempData1.DHT_TemperatureAveDV, 1); 	// 显示偏差
	
	// 显示DHT11平均温度整数部分
	OLED_ShowString(2, 7, 16, TempData2.DHT_TemperatureAve, 1);
	OLED_ShowString(2, 12, 16, TempData2.DHT_TemperatureAveDV, 1);	// 显示偏差
	
	// 显示平均温度和偏差
	OLED_ShowString(3, 7, 16, TempData1.TemperatureAve, 1);
	OLED_ShowString(3, 12, 16, TempData1.TemperatureAveDV, 1);
	
	OLED_ShowString(4, 7, 16, TempData2.TemperatureAve, 1);
	OLED_ShowString(4, 12, 16, TempData2.TemperatureAveDV, 1);
}

void Function_Interface8(void)
{   
    // 显示时间与平均温度
	// DHT11温度和时间
	OLED_ShowString(1, 2, 16, timeData.timeBuff, 1);
	OLED_ShowString(1, 12, 16, TempData1.DHT_TemperatureAve, 1);
	
	OLED_ShowString(2, 2, 16, timeData.timeBuff, 1);
	OLED_ShowString(2, 12, 16, TempData2.DHT_TemperatureAve, 1);
	
	// 热敏电阻温度和时间
	OLED_ShowString(3, 2, 16, timeData.timeBuff, 1);
	OLED_ShowString(3, 12, 16, TempData1.TemperatureAve, 1);
	
	OLED_ShowString(4, 2, 16, timeData.timeBuff, 1);
	OLED_ShowString(4, 12, 16, TempData2.TemperatureAve, 1);
}

//菜单调度表
Menu_table_t TaskTable[] =
{
    //菜单界面函数 -- 一级界面
    {0, 1, 0, 0, Menu_Interface}, 
    //功能界面函数 -- 二级界面
    {1, 5, 2, 0, Function_Interface1},
    {2, 6, 3, 0, Function_Interface2},
    {3, 7, 4, 0, Function_Interface3},
	{4, 8, 1, 0, Function_Interface4},
	//功能设置界面函数 -- 三级界面
	{5, 5, 5, 1, Function_Interface5},
	{6, 6, 6, 2, Function_Interface6},
	{7, 7, 7, 3, Function_Interface7},
	{8, 8, 8, 4, Function_Interface8},
};


/**
 * 更新数据
 */
void Update(void)
{
	// 如果captureFlag被设置
	if (captureFlag) 
	{ 
		if(Sampling_Interval_Count == 3)
		{
			// 捕获温度并计算平均值
			CaptureTemperatureAndCalculateAverage();
			TemHumData_Send(); // USART发送数据
			Sampling_Interval_Count = 1;
		}
		else
		{
			Sampling_Interval_Count++;
		}
		
		captureFlag = 0; // 重置captureFlag标志位
		Delay_ms(5);
	}
}


